'''
    继承是面向对象的重要特性之一,它主要用于描述类与类之间的关系,在不改变原有类的基础上扩展原有类的功能.若类与类之间具有继承关系,被继承的类称为父类或者基类
,继承其他类的类称为子类或派生类,子类会自动拥有父类的公有成员.
'''

'''8.7.1 单继承'''
'''单继承即子类只继承一个父类,Python中单继承的语法格式如下:'''
# class 子类名(父类名):
'''子类继承父类时会自动拥有父类的公有成员.若在定义类时不知名该类的父类,那么该类默认继承基类object'''
# 下面定义一个猫类Cat好人一个集成毛磊的折耳猫类ScottishFold,代码如下:
class Cat:
    def __init__(self,color):
        self.color = color
    def walk(self):
        print('走猫步')
class ScottishFold(Cat):
    pass
s = ScottishFold('黑色')
print(s.color)
s.walk()
'''从以上运行结果可以看出,程序使用子类对象成功访问了父类的属性和方法
   需要注意的是,子类不会拥有父类的私有成员,也不能访问父类的私有成员'''

'''8.7.2 多继承
   程序中的一个类也可以继承多个类,即子类具有多个父类,椰子冻拥有所有父类的公有成员.Python中多继承的语法格式如下所示:
'''
# class 子类名(父类名1,父类名2,...)
# 例如,定义一个表示房屋的类House,一个表示汽车的类Car和一个集成House和Car的子类TouringCar.代码如下:
class House:
    def live(self):
        print('供人居住')
class Car:
    def drive(self):
        print('行驶')
class TouringCar(House,Car):
    pass
t = TouringCar()
t.drive()
t.live()
'''
    子类继承多个父类后自动拥有了多个父类的公有成员
    如果平行的多个父类中有一个同名的方法,子类会先继承和调用括号内排序靠前的父类中的同名方法
'''

'''8.7.3 重写
   程序中,子类会原封不动地继承父类的方法,但子类有时候需要按照自己的需求对继承来的方法进行调整,即在子类中重写从父类继承来的方法.
   python中实现方法重写的方式非常简单,只要在子类中定义与父类重名的方法,然后在方法中按照子类需求重新编写功能代码即可:
    '''
class Person:
    def say_hello(self):
        print('打招呼')

class Chinese(Person):
    def say_hello(self):
        print('吃了吗')

c = Chinese()
c.say_hello()

# 子类重写了父类的方法后,无法直接访问父类的同名方法,但是可以使用super()函数间接调用父类中重写前的方法

class English(Person):
    def say_hello(self):
        super().say_hello()  # 调用父类重写前的方法
        print('hello')
e = English()
e.say_hello()
'''
从以上结果可以看出,程序调用的是父类的say_hello()方法,说明子类通过super(函数成功调用了父类重写前的方法.
'''
